﻿using System.Collections.Generic;

namespace DimensionsHelper.Common.Contracts.Metadata;

public interface IContext : IMetadataNamedObject
{
    /// <summary>
    ///     其他可用的上下文类型。
    /// </summary>
    IReadOnlyList<string> Alternatives { get; }

    /// <summary>
    ///     判断给定上下文名称是否可用。
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    bool IsAlternative(string name);

    /// <summary>
    ///     向可用类型列表中添加新的名称。
    /// </summary>
    /// <param name="name">可用上下文名称</param>
    /// <returns>如果添加的名称不在已有名称列表中，返回true，否则，返回false。</returns>
    bool SetAlternative(string name);


    /// <summary>
    ///     尝试将<see cref="INamedObject.Name" />转换成指定类型。
    /// </summary>
    /// <typeparam name="T">指定类型</typeparam>
    /// <returns></returns>
    T GetEnumType<T>();
}


/// <summary>
///     文档中支持的语言配置类型。<see cref="ILanguage" />接口继承<see cref="INamedObject" />接口，
///     其中的<see cref="INamedObject.Name" />属性值是语言的长代码。
/// </summary>
public interface ILanguage : IContext
{
    /// <summary>
    ///     语言配置的字符串ID。
    /// </summary>
    string Id { get; }

    /// <summary>
    ///     当前语言的短名称，一般是三个英文字母。
    /// </summary>
    string ShortName { get; }

    /// <summary>
    ///     当前语言的长名称，中间有'-'链接。
    /// </summary>
    string LongName { get; }
}

/// <summary>
///     当前文档中的各种上下文类型使用的基础类型。
/// </summary>
public interface IContextsBase<T> : IMetadataObject, IMetadataStringKeyCollection<T> where T : class, IContext
{
    /// <summary>
    ///     默认名称。
    /// </summary>
    string BaseName { get; }

    /// <summary>
    ///     默认值。
    /// </summary>
    T Base { get; }
}

/// <summary>
///     当前文档中的上下文类型设置集合。
/// </summary>
public interface IContexts : IContextsBase<IContext>
{
    /// <summary>
    ///     向集合中添加一个新的上下文配置并返回。
    /// </summary>
    /// <param name="name">上下文类型名</param>
    /// <returns>新创建的上下文配置</returns>
    IContext AddNew(string name);
}

/// <summary>
///     当前文档中的语言类型设置集合。
/// </summary>
public interface ILanguages : IContextsBase<ILanguage>
{
    /// <summary>
    ///     向集合中添加一个新的语言配置并返回。
    /// </summary>
    /// <param name="lang">语言名，可以是长码或短码</param>
    /// <returns>新创建的语言配置</returns>
    ILanguage AddNew(string lang);
}